package server.models.partie;

import java.io.Serializable;
import java.rmi.AccessException;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Observable;

import rmi.RemoteObserver;
import rmi.UtilitairesRmi;
import rmi.WrappedObserver;
import server.models.equipe.IEquipe;
import server.models.terrain.ITerrain;
import server.models.terrain.Terrain;

public class Partie extends Observable implements IPartie, Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private ArrayList<IEquipe> listeEquipes;
	private ITerrain terrain;
	
	public Partie() throws AccessException, RemoteException, AlreadyBoundException, NotBoundException {
		this.listeEquipes = new ArrayList<IEquipe>();
		this.setTerrain((ITerrain)UtilitairesRmi.getInstance().obtenirEtBind(new Terrain()));  
	}

	public ArrayList<IEquipe> getListeEquipes() throws RemoteException {
		return this.listeEquipes;
	}

	public ITerrain getTerrain() throws RemoteException {
		return terrain;
	}

	public void setTerrain(ITerrain terrain) {
		this.terrain = terrain;
		this.setChanged();
		this.notifyObservers();
	}

	//Méthodes publiques
	/**
	 * Ajouter une équipe à la partie
	 * @param iEquipe L'équipe ajoutée
	 */
	public void ajouterEquipe(IEquipe equipe) throws RemoteException
	{
		this.listeEquipes.add(equipe);
		this.setChanged();
		this.notifyObservers();
	}
	
	/**
	 * Obtenir une équipe de part son nom
	 * @param nomEquipe
	 * @return
	 * @throws RemoteException 
	 */
	public IEquipe obtenirEquipe(String nomEquipe) throws RemoteException {
		for (IEquipe equipe : this.listeEquipes) {
			if (equipe.getNom().equals(nomEquipe)) {
				return equipe;
			}
		}
		return null;
	}

	@Override
	public void addObserver(RemoteObserver remoteObserver) throws RemoteException {
		this.addObserver(new WrappedObserver(remoteObserver));	
	}	
}
